/******************************************************************
 * 文件：main.c
 * 功能：主函数入口
 * 日期：2018-02-16
 * 作者：zx
 * 版本：Ver.1.0 | 最初版本
 * 官博：http://fengmeitech.club
 * Copyright (C) 2017 zx. All rights reserved.
*******************************************************************/
#include "stdio.h"
#include "string.h"
#include "DELAY/Delay.h"
#include "LED/LED.h"
#include "NVIC/NVIC.h"
#include "IIC/IIC.h"
#include "OLED/OLED.h"
#include "DHT11/DHT11.h"
#include "UART/uart.h"
#include "NetWork.h"
#include "TIMx/TIMx.h"
#include "DMA/DMA.h"
#include "TLink.h"

#include "GP2Y/GP2Y.h"
#include "GY30/BH1750.h"
//u8 txbuf[20]; //PM2_5 缓存

DeviceSta_Strcture device = {0};
u16 DHT11_data; //存储DHT11传感器采集数据
u8 DGT_get = 0;

int main(void)
{
    SystemInit();
    u8 i = 0, first = 0;
		u16 last_lx=0;

    /*初始化各外设*/
    initSysTick();

    initUART();
    initUART2(); //A2是TX ;A3是RX

    initLED(); //PC13
    closeLED();

    GP2Yinit(); //初始化ADC 和 1014传感器,PA6接ADC输入， PB1接LED输出

    initDHT11(); //初始化dht11，PB9

    iic_init();     //初始化gy-30的iic,C14 SDL; C15 SDA
    bh_mode_init(); //初始化gy-30的模式选择,这句里面有死等while，不加模块时会卡在这里，暂时注释掉

    initIIC();  //初始化oled的iic,B10 SDA ;B11 SCL
    initOLED(); //初始化oled

    initNVIC(NVIC_PriorityGroup_2); //开启UART2的接收和空闲中断

    formatScreen(0x00); //清 屏

    /*打印ESP8266启动信息到OLED*/
    if (initESP8266() != 0)
    {
        showString(0, 0, "init ok!", FONT_16_EN);
    }
    else
    {
        showString(0, 0, "init error!", FONT_16_EN);
    }
    if (connectAP(SSID, PWD) != 0)
    {
        showString(0, 2, "connect AP ok!", FONT_16_EN);
    }
    else
    {
        showString(0, 2, "connect AP error!", FONT_16_EN);
    }
    if (connectTlink() != 0)
    {
        showString(0, 4, "connect TLink ok", FONT_16_EN);
    }
    else
    {
        showString(0, 4, "connect TLink no", FONT_16_EN);
    }
    initTIMx(TIM3, 7199, 9999, TIM_IT_Update, ENABLE);
    TIM_ARRPreloadConfig(TIM3, ENABLE);

    Delay_ms(1000); //让数据保持一段时间
    formatScreen(0x00);
    //showString(0, 0, "Monitor station", FONT_16_EN);
    showString(0, 0, "AQI :", FONT_16_EN);

    showString(0, 2, "Hum :", FONT_16_EN);
    showString(100, 2, "%", FONT_16_EN);

    showString(0, 4, "Temp:", FONT_16_EN);
    showString(100, 4, "'C", FONT_16_EN);

    showString(0, 6, "BRN :", FONT_16_EN);
    showString(100, 6, "lux", FONT_16_EN);

    while (1)
    {
        // if (first == 0)
        // {
        //     first++;
        //     DHT11_data = readDHT11();
        //     device.Humidity = DHT11_data >> 8;        //湿度只取高八位
        //     device.Temperature = DHT11_data & 0x00FF; //低八位代表温度
        // }
        /*数据显示*/
        if (++i > 30)
        {
            i = 0;
            showNumber(40, 0, device.PM2_5, DEC, 7, FONT_16_EN);
            showNumber(40, 2, device.Humidity, DEC, 3, FONT_16_EN);
            showNumber(40, 4, device.Temperature, DEC, 3, FONT_16_EN);
            showNumber(40, 6, device.Lux, DEC, 7, FONT_16_EN);
        }

        Delay_ms(10);
    }
}

void TIM3_IRQHandler(void)
{

    /*数据采集*/
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
        if (++DGT_get >= 2) //每隔2S采集一次 建议采集间隔最小不要小于2S
        {
            DGT_get = 0;
            DHT11_data = readDHT11();
            device.Humidity = DHT11_data >> 8;        //湿度只取高八位
            device.Temperature = DHT11_data & 0x00FF; //低八位代表温度
           
        }

        device.PM2_5 = (u16)GetGP2Y();           //采集 PM2.5. 单位ug/m3
        device.Lux = (bh_data_read() / 1.2) / 2; //采集 光照强度
         toggleLED();
        sendDeviceStatus(&device);
    }
}
